<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>

        // 一、对象的构成
        // let obj = {
        //     name:"张三"
        // }
        // 在对象的原型上添加内容（属性，方法）;
        // let obj =   Object.create({
        //     name:"张三"
        // })
        // 一个对象 由2部分构成 ，一个是自身属性和方法 ，还有是原型（__proto__:[[Prototype]],隐式原型）上的属性和方法
        // console.log(obj);
        // console.log( obj.name);


    //     function Person(name){
    //         this.name = name;
    //     }
    //     // Person.prototype.constructor === Person //固有属性指向 Person
    //     let zhangsan  = new Person();
    //     // 可以知道 zhangsan 是不是 Person构造出来的
    //    console.log(zhangsan.constructor===Person)


    // 二、关于constructor的指向 
        // 万物皆对象
       
        // let obj = new Object();
        // console.log( obj.constructor===Object)  //判断obj是一个对象类型
        // let arr = new Array();
        // console.log(arr.constructor===Array); //判断是一个数组
        // let fn = new Function();
        // console.log(fn.constructor===Function)
        // let reg = new RegExp();
        // console.log(reg.constructor===RegExp);
        // let str=  "fda";
        // console.log(typeof str === 'string');
         // constructor 是每一个构造函数 的原型里自带的属性 （系统帮咋们定义好了）;
        //  一旦声明了构造函数 ，构造函数原型就自动声明了
        // 原型自动声明之后 就会在prototype上自动声明一个 constructor属性这个constructor会指向 构造函数 
        // 这个过程不需要我们写 ，是系统自动的；
        // function Dog(){

        // }
    //   console.log(  Dog.prototype)
        /* 
            一旦声明构造函数后，系统会自动 
            Dog.prototype.constructor = Dog;

            xiaohuang.constructor===Dog
        
        */

// 三、prototype原型的赋值 
// 定义一个构造函数
function Person(name){
    this.name = name;
}
// 给构造函数的原型加fn方法
// Person.prototype.fn  = function(){
//     console.log("fn")
// }
// // 给构造函数的原型加hobby方法
// Person.prototype.hobby  = function(){
//     console.log("hobby")
// }
// 这样写行不行？？？？
// console.log(typeof Person.prototype)
// Person.prototype上已经有一个属性是constructor 如果向下面这样赋值会覆盖掉原本的
// 系统自带的constructor属性
Person.prototype = {
    fn:function(){
        console.log("fn")
    },
    hobby:function(){
        console.log("hobby");
    }
}
// 需要人为的把constructor指回来
Person.prototype.constructor=Person;

// 实例化Person得到 zhangsan对象；
let zhangsan = new Person("张三");
zhangsan.fn();
zhangsan.hobby();
console.log(zhangsan.constructor===Person);

      

    </script>
</body>
</html>